package com.qikecn.utils;

import javax.servlet.http.HttpServletRequest;

/**
 * java获取远端ip地址、端口号工具类
 * @author wangst
 */
public class IpUtil {
	/**
	 * 获取ip地址
	 * @param request
	 * @return
	 * 如果通过了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串IP值，究竟哪个才是真正的用户端的真实IP呢？ 
	 * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。如： 
	 * X-Forwarded-For：192.168.1.110,192.168.1.120,192.168.1.130,192.168.1.100
	 * 用户真实IP为:192.168.1.110
	 */
	public static String getRemoteIp(HttpServletRequest request) {
		String ip = request.getHeader("x-forwarded-for");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("X-Real-IP");
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		if(ip != null){
			ip = ip.replaceAll(" ", "");
			ip = ip.replaceAll("，", ",");
			String[] temps = ip.split(",");
			for(String temp : temps){
				if(temp != null && !temp.equals("")){
					if(!temp.trim().equalsIgnoreCase("unknown")){
						ip = temp.trim();
						break;
					}
				}
			}
		}

		if (ip == null || ip.equals("")){
			ip = "unknown";
		}

		return ip;
	}
	
	
}
